﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using ComunesMGI.DataTypes;
using System.Configuration;
using System.Data;
using ComunesMGI.Excepciones;

namespace MGI.AccesoDatos.AccesoBD
{
    class BDClientes
    {
        public List<DataCliente> GetClientes()
        {
            string nombre = "";
            int codigo = 0;

            List<DataCliente> listaClientes = new List<DataCliente>();
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "Exec GetClientes";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();

                while (lector.Read())
                {
                    nombre = (string)lector["CliNom"];
                    codigo = (int)lector["CliCod"];

                    DataCliente cliente = new DataCliente(codigo, nombre);
                    listaClientes.Add(cliente);
                }
                
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return listaClientes;
        }

        public DataCliente GetCliente(int codCliente)
        {
            DataCliente dataCliente = null;
            string nomCliente = "";
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetCliente";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@CliCod", codCliente);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();

                if (lector.Read())
                {
                    nomCliente = (string)lector["CliNom"];
                    dataCliente = new DataCliente(codCliente, nomCliente);


                }
                else
                {
                    throw new Exception("No existe el cliente de codigo: " + codCliente);
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return dataCliente;
        }

        public int AddCliente(DataCliente cli)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            string textoComando = "AgregarCliente";
            SqlCommand cmd = new SqlCommand(textoComando, cnn);
            int id = -1;
            try
            {
                //obtenemos le estado inicial, con el que se dara de alta el wp
                cnn.Open();
                
                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter nombre = new SqlParameter("@CliNom", cli.Nombre);

                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(nombre);
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                id = (int)cmd.Parameters["@retorno"].Value;

                if (id == 0)
                {
                    throw new YaExisteRegistro("Ya existe un cliente con ese nombre");
                }
                else if (id == -1)
                {
                    throw new Exception("Problemas en la base de datos");
                }

            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }

            cli.Codigo = id;

            return id;
        }

        public void BajaCliente(int cliCod)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            string textoComando = "EliminarCliente";
            SqlCommand cmd = new SqlCommand(textoComando, cnn);

            int error = -1;
            try
            {
                cnn.Open();

                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter codCliente = new SqlParameter("@CliCod", cliCod);

                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(codCliente);
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                error = (int)cmd.Parameters["@retorno"].Value;

                if (error == 0)
                {
                    throw new YaExisteRegistro("No existe un cliente con ese codigo");
                }
                else if (error == -1)
                {
                    throw new Exception("Problemas en la base de datos al eliminar");
                }
                else if (error == -2)
                {
                    throw new Exception("No se puede eliminar el cliente porque tiene sistemas asociados");
                }

            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }
        }

        public void ModificarCliente(DataCliente cli)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            int afectados = -1;
            try
            {
                string textoComando = "ModificarCliente";
                SqlCommand cmd = new SqlCommand(textoComando, cnn);
                cnn.Open();

                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter codCliente = new SqlParameter("@CliCod", cli.Codigo);
                SqlParameter nomCliente = new SqlParameter("@CliNom", cli.Nombre);
                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(codCliente);
                cmd.Parameters.Add(nomCliente);
                
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                afectados = (int)cmd.Parameters["@retorno"].Value;

                if (afectados == 0)
                {
                    throw new NoExisteRegistro("No existe el cliente con dicho codigo");
                }
                else if (afectados == -1)
                {
                    throw new Exception("Problemas en la base de datos");
                }
                else if (afectados == -2)
                {
                    throw new YaExisteRegistro("Ya existe un cliente con ese nombre");
                }

            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }
        }
    }
}
